x86 numa: fix nodes' memory parsing when SRAT table includes future-hotplug memory...
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 12 Aug 2009 13:16:09 +0000 (14:16 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 12 Aug 2009 13:16:09 +0000 (14:16 +0100)
A node's future-hotplug memory range starts from very high end
normally, e.g. 1TB, and is not continuous with its current existing
memory range. It should not be covered by the global variable 'nodes'
as it assumes the node's memory is continuous. Otherwise it can make
nodes' memory ranges become very big and overlapped, and
populate_memnodemap() fails.

We can ignore future-hotplug memory range for now. Physical memory
hotplug support in future will handle it.

Signed-off-by: Yang Xiaowei <xiaowei.yang@intel.com>
xen/arch/x86/srat.c

index f5fe812bf0eb7bfc7bd8c7aa5118692b7db445d6..7f90e096857291c06666014d5f65736d69029f49 100644 (file)
@@ -189,10 +189,21 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
                bad_srat();
                return;
        }
-       /* It is fine to add this area to the nodes data it will be used later*/
-       if (ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)
-               printk(KERN_INFO "SRAT: hot plug zone found %"PRIx64" - %"PRIx64" \n",
+       if (ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) {
+               if (page_is_ram_type(paddr_to_pfn(start), RAM_TYPE_CONVENTIONAL))
+                       printk(KERN_INFO "SRAT: hot-pluggable zone found %"PRIx64" - %"PRIx64" \n",
                                start, end);
+               else {
+                       /* TODO: This range contains no existing memory yet,
+                        * and shouldn't be included in nodes' [start, end]. It
+                        * will be covered with physical memory hotplug support
+                        * in future.
+                        */
+                       printk(KERN_INFO "SRAT: future hotplug zone found %"PRIx64" - %"PRIx64" \n",
+                               start, end);
+                       return;
+               }
+       }
        i = conflicting_nodes(start, end);
        if (i == node) {
                printk(KERN_WARNING